package com.demo.money.kit;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

/**
 * @ProjectName: demo1
 * @Package: com.example.demo1.kit
 * @ClassName: Md5Until
 * @Description: 工具类
 * @Author: 张峰浦
 * @CreateDate: 2020/3/11 12:18
 * @Version: 1.0
 */

/**
 * Md5Until类<br>
 * Md5加密,不可逆的加密
 * <p>
 * <b>常用方法</b><br>
 * md5-简单的MD5加密<br>
 * setMd5-二次加密MD5
 * <p>
 * <b>私有方法</b><br>
 * set2Md5-MD5加码 生成32位md5码
 * <p>
 * <b>全类名</b>:com.example.demo1.kit<br>
 * <b>类名</b>:Md5Until<br>
 * <b>创建者</b>:张峰浦<br>
 * <b>创建时间</b>:2020/3/12 21:02<br>
 */
public class Md5Until {
    /**
     * 简单的MD5加密<br/>
     * 直接用Base64和md5处理明文string，得到一个简单加密的密文
     *
     * @param password 需加密的明文string
     * @return 处理后的密文string
     */
    public static String md5(String password) {

        try {

            MessageDigest md = MessageDigest.getInstance("md5");

            //生成随机东东 不可逆
            byte[] bytes = md.digest(password.getBytes());

            return Base64.getEncoder().encodeToString(bytes);

        } catch (NoSuchAlgorithmException e) {

            e.printStackTrace();

        }

        return null;

    }

    /**
     * MD5加码 生成32位md5码
     *
     * @param inStr 需加密的明文string
     * @return 处理后的密文string
     */
    private static String set2Md5(String inStr) {

        MessageDigest md5;

        try {

            md5 = MessageDigest.getInstance("MD5");

        } catch (Exception e) {

            System.out.println(e.toString());

            e.printStackTrace();

            return "";

        }

        char[] charArray = inStr.toCharArray();

        byte[] byteArray = new byte[charArray.length];

        for (int i = 0; i < charArray.length; i++) {

            byteArray[i] = (byte) charArray[i];

        }
        byte[] md5Bytes = md5.digest(byteArray);

        StringBuilder hexValue = new StringBuilder();

        for (byte md5Byte : md5Bytes) {

            int val = ((int) md5Byte) & 0xff;

            if (val < 16) {

                hexValue.append("0");

            }
            hexValue.append(Integer.toHexString(val));

        }

        return hexValue.toString();

    }

    /**
     * 二次加密MD5<br/>
     * 主动增加字符串复杂度
     *
     * @param inStr 需加密的明文string
     * @return 处理后的明文string
     */
    public static String setMd5(String inStr) {

        String xy = "$159@Aioizi";

        String finalStr;

        if (inStr != null) {

            String fStr = inStr.substring(0, 1);

            String lStr = inStr.substring(1, inStr.length());

            finalStr = set2Md5(fStr + xy + lStr);

        } else {

            finalStr = set2Md5(xy);

        }

        return finalStr;

    }

}
